﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpModelInterface.h"
#include "IObject.h"

namespace gcmp
{
    class ElementId;

    /// \brief 元素父子强弱关系依赖报告关系接口类
    ///
    /// 该类是一个访问接口类，外部不允许继承。平台内部有对应的实现类。
    FINAL_INTERFACE class GCMP_MODEL_INTERFACE_EXPORT IElementParentReporter
    {
    public:
        /// \brief 报告与父对象关系为弱依赖关系
        /// 
        /// 弱关系表示如果弱依赖对象(父对象)被删除，自己类会响应UpdateForWeakParentDeletion函数
        /// 在UpdateForWeakParentDeletion函数中处理相关逻辑
        /// \param parentId 依赖对象id
        /// \return 依赖关系引用
        virtual IElementParentReporter& ReportWeak(const ElementId& parentId) = 0;

        /// \brief 报告与父对象关系为弱依赖关系
        /// 
        /// 弱关系表示如果弱依赖对象(父对象)被删除，自己类会响应UpdateForWeakParentDeletion函数
        /// 在UpdateForWeakParentDeletion函数中处理相关逻辑
        /// \param parentId 一组依赖对象ids
        /// \return 依赖关系引用
        template<class Container>
        IElementParentReporter& ReportWeak(const Container& parentIds) { FOR_EACH(id, parentIds) { ReportWeak(id); }return *this; }

        /// \brief 报告与父对象关系为强依赖关系
        /// 
        ///强依赖关系表示如果强依赖对象(父对象)删除，自己也会变系统自动删除。
        /// \param parentId 依赖对象id
        /// \return 依赖关系引用
        virtual IElementParentReporter& ReportStrong(const ElementId& parentId) = 0;

        /// \brief 报告与父对象关系为强依赖关系
        /// 
        ///强依赖关系表示如果强依赖对象(父对象)删除，自己也会变系统自动删除。
        /// \param parentIds 一组依赖对象ids
        /// \return 依赖关系引用
        template<class Container>
        IElementParentReporter& ReportStrong(const Container& parentIds) { FOR_EACH(id, parentIds) { ReportStrong(id); }return *this; }

        /// \brief  得到所有强依赖对象(父对象)元素id
        /// \return 所有强依赖对象(父对象)元素id
        virtual const std::set<ElementId>& GetStrongParents() const = 0;

        /// \brief  得到所有弱依赖对象(父对象)元素id
        /// \return 所有弱依赖对象(父对象)元素id
        virtual const std::set<ElementId>& GetWeakParents() const = 0;
    };
}



